<?php

# -- DÉBUT NOTE DE LICENCE -------------------------------------
#
# Ce fichier fait partie de Clicpage.
#
# Copyright (c) 2010 Francois (www.clicpage.net)
# Distribué selon les termes de la licence GPL version 2.0.
# Consultez le fichier LICENCE ou
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- FIN NOTE DE LICENCE ---------------------------------------

class cpPublic
{

	public $core;
	
	public $url;
	
	public $apercu;
	
	
	public function __construct($core)
	{
		
		$this->core =& $core;
		
		$this->url = new cpUrlHandler('query_string');
		$this->url->registerDefault(array($this,'page'));
		$this->url->registerError(array($this,'erreur'));
		$this->url->register('media','medias','^medias(/.+)?$',array($this,'media'));
		$this->url->register('media-plugin','cp/plugins','^cp/plugins(/.+)?$',array($this,'mediaPlugin'));
		$this->url->register('rss2xsl','cp/rss2xsl','^cp/rss2.xsl$',array($this,'rss2xsl'));
		
	}
	
	
	public function traiterRequete()
	{
		
		# --COMPORTEMENT-- publicAvantDocument
		$this->core->executerComportement('publicAvantDocument', $this);
		
		$this->url->getDocument();

		# --COMPORTEMENT-- publicApresDocument
		$this->core->executerComportement('publicApresDocument', $this);
		
	}
	
	
	public function initAuth()
	{
		# Authentification
		$this->core->initAuth();
		$this->core->auth->verifierUtilisateur();	
	}
	
	
	public function page($args)
	{
		
		$this->initAuth();
		
		# Paramètres séparés par des virgules
		$paramsUrl = explode(',', $args);
		$url = $paramsUrl[0];
		
		if(count($paramsUrl) > 1) {
			unset($paramsUrl[0]);
			foreach($paramsUrl as $k => $v){
				$v = rawurldecode($v);
				$_GET[$k] = $v;
				$_REQUEST[$k] = $v;
			}
		}

		# Aperçu?
		if($_GET['apercu'] == '1' && $this->core->auth->verifierPermission('administrer'))
		{
			
			# Récupérer la page dans la base de données
			$rs = $this->core->con->select('SELECT page_id FROM '.$this->core->prefix.'temp_pages '.
				"WHERE page_url = '".$this->core->con->escape($url)."' LIMIT 1");
			
			$params = $rs->isEmpty() ?
				array('page_url' => $url) :
				array('page_id' => $rs->page_id);

			$page = $this->core->site->getPages($params, CP_GET_STATIC, CP_TEMPORAIRE);
			
			$this->apercu = true;
			
		}
		else 
		{
			
			# URL vide = affichage de l'accueil
			if($url == '') {
				$params = array(
					'page_id' 		=> $this->core->site->getPropriete('home_page_id', 'core'),
					'page_statut' 	=> CP_STATUT_ONLINE
				);
			} else {
				$params = array(
					'page_url' 		=> $url,
					'page_statut' 	=> CP_STATUT_ONLINE
				);
			}
			
			# Récupérer la page dans la base de données
			$page = $this->core->site->getPages($params, CP_GET_STATIC);
			$this->apercu = false;
			
		}
		
		# Page introuvable: erreur 404
		if($page->isEmpty()) {
			cpPublic::erreur404();
		}

		# Chargement des fichiers de langue
		$this->core->setLangue($page->public_langue());
		$this->core->chargerFichierLangue('date');
		$this->core->chargerFichierLangue('main');
		$this->core->chargerFichierLangue('public');
		
		# Permission requise
		if($page->page_acces == CP_ACCES_PERMISSION) {
			if(!$this->core->auth->estConnecte()) {
				cpPublic::erreur401('connexion_requise');
			}
			elseif(!in_array($this->core->auth->utilisateur->groupe_id, unserialize($page->page_acces_details))) {
				cpPublic::erreur401('acces_refuse');
			}
		}
		
		# Mot de passe requis
		if($page->page_acces == CP_ACCES_MOT_DE_PASSE && !$_SESSION['acces_public'][$page->page_id]) {
			if(	$_POST['action'] == 'public_mot_de_passe' &&
				$_POST['nonce'] == $_SESSION['nonces']['public_mot_de_passe'] &&
				crypt::hmac(CP_MASTER_KEY,$_POST['mot_de_passe']) == $page->page_mot_de_passe
			) {
				$_SESSION['acces_public'][$page->page_id] = true;
				unset($_SESSION['public_mot_de_passe']);
			}
			else {
				cpPublic::erreur401('mot_de_passe_requis');
			}
		}	

		# Envoi de la page
		$page->initPublic();
		$page->afficher();
		
	}
	
	
	public function media($args)
	{		
		
		$media = $this->core->site->getMedias(array(
			'media_url' => $args
		), CP_GET_STATIC);
		
		if($media->isEmpty()) {
			cpPublic::erreur404();
		}
		
		$media->afficher($_GET['s'], (boolean) $_GET['download']);
	}
	
	
	public function mediaPlugin($args)
	{
		
		$url = substr($args, 1);
		$plugin = substr($url, 0, strpos($url, '/'));
		$fichier = substr($url, strpos($url, '/')+1);
		$chemin_fichier = CP_CHEMIN_PLUGINS.'/'.path::clean($plugin.'/medias/'.$fichier);

;		if(preg_match('#^admin(/.+)?$#', $fichier) || !file_exists($chemin_fichier)) {
			cpPublic::erreur404();
		}
		
		$type = files::getMimeType($fichier);

		# Headers
		header('Content-Type: '.$type);
		http::cache(array($chemin_fichier));
		
		#  CSS: ajuster les URL
		if($type == 'text/css') {
			$contenu = file_get_contents($chemin_fichier);
			echo str_replace("url('", "url('".CP_URL_PUBLIQUE_RELATIVE.'cp/plugins/'.$plugin.'/', $contenu);
			exit;
		}
		
		# Envoi du contenu du fichier
		readfile($chemin_fichier);
		
	}
	
	
	public function rss2xsl($args)
	{
		# Envoi du contenu du fichier
		readfile(CP_RACINE.'/inc/public/rss2.xsl');
	}
	
	
	public function erreur($args, $type, $e)
	{
		switch($e->getCode()):
			case 1401: return $this->afficheErreur401($args, $type, $e); break;
			case 1404: return $this->afficheErreur404($args, $type, $e); break;
		endswitch;
	}
	
	public function afficheErreur401($args, $type, $e)
	{	
		
		$this->core->initAuth();		
		
		# Page d'erreur
		$page = new cp401($this->core);
		$page->setType($e->getChamp());
		$page->afficher();
		return true;
	}
	
	
	public function afficheErreur404($args, $type, $e)
	{	
		
		$this->core->initAuth();
		
		# Chargement de la langue
		$this->core->setLangue($this->core->site->getPropriete('site_langue'));
		$this->core->chargerFichierLangue('date');
		$this->core->chargerFichierLangue('main');
		$this->core->chargerFichierLangue('public');
		
		# Page d'erreur
		$page = new cp404($this->core);
		$page->afficher();
		return true;
	}
	
	
	public static function erreur401($details)
	{
		throw new cpErreur(null, $details, 1401);
	}
	
	
	public static function erreur404()
	{
		throw new cpErreur(null, null, 1404);
	}
	
	
	# ----- Comportements -----
	
	
	public function publicHead($_ctx)
	{
		if($_ctx->core->public->apercu)
		{
			echo '<style type="text/css">
			#cpApercu {
				position:fixed;
				background:white;
				color:black;
				font: 1em Arial,sans-serif;
				padding:5px;
				left:0;
				right:0;
				opacity:0.7;
				filter : alpha(opacity=70);
				z-index:999999;
			}
			#cpApercu p {
				padding:0 8px;
				margin:0;
				height:25px;
			}
			#cpApercu .cpApercuFermer {
				margin-top:-25px;
				text-align:right;
			}
			#cpApercu a {
				color:blue;
				text-decoration:underline;
			}
			</style>';
		}
	}
	
	
	public function publicAvantCorps($_ctx)
	{
		if($_ctx->core->public->apercu)
		{
			echo '<div id="cpApercu">'.
				'<p class="cpApercuInfo">'.__('Ceci est un aperçu d\'une version non publiée de la page.').'</p>'.
				'<p class="cpApercuFermer"><a href="#" onclick="self.close(); return false;">'.__('Fermer la fenêtre').'</a></p>'.
			'</div>';
		}
	}
	
}

?>